package com.mijie.fentsi;

 
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import net.sf.json.JSONArray;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.DuplicateFilter;
import org.apache.lucene.search.Filter;
import org.apache.lucene.search.FilteredQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

import com.mijie.homi.search.util.MyCustomFilter;
import com.mijie.homi.search.util.strUtil;
import com.mijie.query.LuceneIndex;
 


/**
 * @author chongxin
 * @since 2013/6/19
 * @version Lucene 4.3.1
 * */
public class LuceneSearch {
	public static String cmdReturnStr;
	// 声明一个IndexSearcher对象
	private IndexSearcher searcher = null;
	// 声明一个Query对象
	private Query query = null;
	private String field = "contents";
	public Set   lookSet=new HashSet<Integer>();
	private String renva;
	private String event;
	private String cinsyv;

	public LuceneSearch() {
		try {
			String INDEX_STORE_PATH = "c:\\luceneIndex4sincin";
			IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(INDEX_STORE_PATH)));
		
			searcher = new IndexSearcher(reader);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
    //返回查询结果 
//	public final TopDocs search(String keyword) {
//		System.out.println("正在检索关键字 : " + keyword);
//		try {
//			Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_40);
//			QueryParser parser = new QueryParser(Version.LUCENE_40, field,analyzer);
//			// 将关键字包装成Query对象
//			
//			
//			//query = parser.parse(keyword);
//			 //要查找的字符串数组 
//				 String[] stringQuery= keyword.split(" ");//  {"我们","今晚"};             //待查找字符串对应的字段 
//					 String[] fields={"content","content"}; 
//					 	//Occur.MUST表示对应字段必须有查询值， Occur.MUST_NOT 表示对应字段必须没有查询值 
//					 	Occur[] occ={Occur.MUST,Occur.MUST}; 
//					 	query=MultiFieldQueryParser.parse(stringQuery,fields,occ,newStandardAnalyzer());
//			
//			Date start = new Date();
//		//	1 根据关键字只取索引库中的前100条document，然后把这100条document按某种方式进行排序，安得分从高到低返回结果。 
//			TopDocs results = searcher.search(query, 5 * 2);
//			Date end = new Date();
//			System.out.println("检索完成，用时" + (end.getTime() - start.getTime())
//					+ "毫秒");
//			return results;
//		} catch (Exception e) {
//			e.printStackTrace();
//			return null;
//		}
//	}
	
	 public LuceneSearch(int i) {
		// TODO Auto-generated constructor stub
	}

	//返回查询结果 
	@SuppressWarnings("deprecation")
	public final TopDocs search4WhitespaceAnalyzer(String keyword) {
		

		 String[] stringQuery2=getQueryStrArr(keyword);
			 
		 String[] fields=getFields(); 
			
		 Occur[]  occ=getOccur();
			 
			 	//Occur.MUST表示对应字段必须有查询值， Occur.MUST_NOT 表示对应字段必须没有查询值 
			
			//  Occur[] occ={,Occur.SHOULD}; 
			// Occur[] occ={Occur. MUST,Occur.MUST}; 
			 WhitespaceAnalyzer whitespaceAnalyzer = new WhitespaceAnalyzer(Version.LUCENE_40);
			 DuplicateFilter filter = new DuplicateFilter("id"); 
			try {
				//return BooleanQuery
				  	query=  MultiFieldQueryParser.parse(Version.LUCENE_40,stringQuery2,fields,occ,whitespaceAnalyzer);
			} catch (ParseException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		
		
		System.out.println("正在检索关键字 : " + keyword);
		try {
			Analyzer analyzer = whitespaceAnalyzer;
			QueryParser parser = new QueryParser(Version.LUCENE_40, field,analyzer);
			// 将关键字包装成Query对象
		//	query = parser.parse(keyword);
		//	DuplicateFilter df = new DuplicateFilter("topicId");  
			MyCustomFilter df = new MyCustomFilter("453007"); //作为是否重复的判断依据field
		//	df.setKeepMode(DuplicateFilter.PM_FAST_INVALIDATION);
			
			Date start = new Date();
			TopDocs results = searcher.search(query,  20*5);
			Date end = new Date();
			System.out.println("检索完成，用时" + (end.getTime() - start.getTime())
					+ "毫秒");
			return results;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	
	
	private Occur[] getOccur() {

		List<String> li=new ArrayList<String>();
		int len=this.keywordCount;
		 if(this.renva!=null)
		 {
			 len++; 
			 li.add(this.renva);
		 }
		 if(this.event!=null)
		 {
			 len++; 
			 li.add(this.event);
		 }
		 if(this.cinsyv!=null){
			 len++; 
			 li.add(this.cinsyv);
		 }
		 
		 //filed
		 Occur[] occ=new Occur[len];
		 for(int i=0;i<occ.length;i++)
		 {
			 occ[i]=Occur.SHOULD;
			 
		 }
		 
		 
		 for(int i=0;i<li.size();i++)
		 {
			 occ[ this.keywordCount+i]= Occur.MUST;
		 }
		 return occ;

		
		 
	}

	private String[] getFields() {
		
		List<String> li=new ArrayList<String>();
		int len=this.keywordCount;
		 if(this.renva!=null)
		 {
			 len++; 
			 li.add("renva");
		 }
		 if(this.event!=null)
		 {
			 len++; 
			 li.add("event");
		 }
		 if(this.cinsyv!=null){
			 len++; 
			 li.add("cinsyv");
		 }
		 
		 //filed
		 String[] fields=new String[len];
		 for(int i=0;i<fields.length;i++)
		 {
			 fields[i]="contents";			 
		 }
		 
		 
		 for(int i=0;i<li.size();i++)
		 {
			 fields[ this.keywordCount+i]= li.get(i);
		 }
		 return fields;
		 
	}


	public int keywordCount;
	private String[] getQueryStrArr(String keyword) {
		keyword=keyword.replaceAll("  ", " ");keyword=keyword.replaceAll("  ", " ");keyword=keyword.replaceAll("  ", " ");
		keyword=keyword.trim();
		
		// 要查找的字符串数组 
		 String[] stringQuery= keyword.split(" ");//  {"我们","今晚"};             //待查找字符串对应的字段 
		 int len=stringQuery.length;
		 keywordCount=len;
		 List<String>  li= strUtil.toList(stringQuery);
			
		 
			 if(this.renva!=null)
			 {
				 len++; 
				 li.add(this.renva);
			 }
			 if(this.event!=null)
			 {
				 len++; 
				 li.add(this.event);
			 }
			 if(this.cinsyv!=null){
				 len++; 
				 li.add(this.cinsyv);
			 }
			 
			
			
			 String[] a=	 (String[]) li.toArray(new String[li.size()]);
			 return a;
	}

	public String search4tonitsi(String keyword) {
		TopDocs h = null;
//		h = test.search("中国");
//		test.printResult(h);
//		h = test.search("人民");
//		test.printResult(h);
//		h = test.search("共和国");
//		test.printResult(h);
		h=search4WhitespaceAnalyzer(keyword);
		String r=		toString(h,keyword);
		
		//致力,努力,努力,尽力,努力,勉力,高兴,努力,努力,起劲,努力,积极,通力合作,共同努力,重新努力别辟门户,另起炉灶,努目,瞪眼,有力,无力
		
		return r;
	}
      //打印结果
	public void printResult(TopDocs results) {
		ScoreDoc[] h = results.scoreDocs;
		if (h.length == 0) {
			System.out.println("对不起，没有找到您要的结果。");
		} else {
			for (int i = 0; i < h.length; i++) {
				try {
					Document doc = searcher.doc(h[i].doc);
					System.out.print("这是第" + i + "个检索到的结果，为：");
					System.out.println(doc.get("contents"));
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		System.out.println("--------------------------");
	}

	
	public String toString(TopDocs results,String keyword) {
		
		Set<String> setDeduli=new HashSet<String>();
		 List  lir=new ArrayList ();
		lookSet.clear();
		if(results==null)return "noresultcaa";
		String s="";
		ScoreDoc[] h = results.scoreDocs;
		if (h.length == 0) {
			System.out.println("对不起，没有找到您要的结果。");
		} else {
			for (int i = 0; i < h.length; i++) {
				try {
					Document doc = searcher.doc(h[i].doc);
					 
					     String id=doc.get("id");
						String result = doc.get("contents");
						 Map mp=new HashMap<String, String>();
						 mp.put("id", doc.get("id"));
						 mp.put("text", result);
						 mp.put("renva", doc.get("renva"));
						 mp.put("event",doc.get("event"));
						 mp.put("cinsyv",doc.get("cinsyv"));
						 
						 if(!setDeduli.contains(id))
						 {
						 lir.add(mp);
						 setDeduli.add(id);
						 
						 }
					 
					//System.out.println(doc.get("contents"));
				} catch (Exception e) {
					e.printStackTrace();
					
				}
			}
		}
		  String eventStrformat = JSONArray.fromObject(lir).toString(2);
	 
		return  eventStrformat;
		 
	}
	fentsiOr fentsiCca22;
	String fentsi(String line) {
		String wordLibs = "c:\\word\\wordFromInputmethod_deSingle_addSingword.txt,c:\\word\\word.txt,c:\\word\\word_ext.txt";
		
		if(fentsiCca22==null)
		{
		// wordLibs=""; 没字典的时候儿全部单字分割.. 他|说|他|还|爱|我|的|确|他|对|我|很|好|可|是|
			fentsiCca22 = new fentsiOr();
		
		}
	//	fentsiCca22=fc;
		String r = fentsiCca22.fentsi_disableDefaultTsiku(line, wordLibs);
		return r;
	}
	public fentsiCa22 fentsiCa22_new;
	public static	String s_fentsi="";
	public static	String 	s_fentsi_filted="";
	public static String renvaResultStrformat;
	public static String eventResultStrformat;
	 
	public static void main(String[] args) throws Exception {
		LuceneSearch test = new LuceneSearch();
		TopDocs h = null;
		renvaEventC renvaEventCca22=	new renvaEventC();
		LuceneSearch ls=new LuceneSearch();
		ls.fentsiCa22_new=new fentsiCa22();
//		h = test.search("中国");
//		test.printResult(h);
//		h = test.search("人民");
//		test.printResult(h);
//		h = test.search("共和国");
//		test.printResult(h);
		
		String str="郁闷@和女朋友吵架了，是我的问题，但从根本上说是相互不理解，我太迁就她，却不考虑我的感受";
		str="气愤@本打算今晚相亲的，结果他突然有事了，哎！没相成。";
		str="无感@以后聊天什么的找我有事直接说事，别总问我在不在，在不在的。你说让我怎么回答你？我说在，你跟我借钱怎么办！我说不在，你请我吃饭怎么办！我说在，没好事怎么办！我说不在，有好事落下了怎么办！所以有事直接说！这样我好知道我在还是不在！";
		str="气愤@因为 无意 没接 到 你的 电话 从 凌晨 等到 你 上班 的 时间 才 给你 打电话 你 却 因为 睡觉 说 我 烦 等到 你 我都 下班了 给你 打电话 你 因为 你在 吃饭 说 等 会 儿 打 结果 这 一等 就是 4 个 多 小时 我 承认 我 很 不开心 很 不开心 看了看 日期 突然 想起 你说 的 今天晚上 要 陪 你 爸 妈 去 唱歌 我 承认 我 伤心 了 真的 伤心 了 你 还是 那么 喜欢 玩 可以 因为 去 玩 而 忘记 我的 存在 这 就 是我 死心塌地 爱 着 的 男人 这 就 是我 一心一意 对待 的 男人 这 就 是我 执意 叛逆 选择 的 男人 我 累了 不论 对 谁 我都 累了 在 我的 世界 里 没有 所谓 长久 的 情 不管 是这个 世间 的 哪 一种 情 ";
		if(args.length>0)
		{
			str=args[0].trim();
		}
		String[] stra=str.split("@");
		String sincin=stra[0];
		String s= stra[1];
		// 今日|工作|好了|一点|天气|变|冷了|南方|雨水|最多|整天|都|阴冷|阴冷|的|
		//|今日|工作|天气|冷了|南方|雨水|最多|整天|阴冷|阴冷
		
		  s_fentsi=ls.fentsi(s);
	  	s_fentsi_filted=ls.fentsiCa22_new.filt(s_fentsi );
	//s_fentsi_filted=s_fentsi_filted.re
		String keyword =s_fentsi_filted;// "男人 世界";
		keyword=keyword.replace('|', ' ');
		keyword=keyword.trim();
//		h=test.search(keyword);
//		test.printResult(h);
		 LuceneIndex lic=new LuceneIndex(0);
		
		
	
		test.renva= renvaEventCca22.getType(keyword.split(" "));
		List<Map>  renvaResult=renvaEventCca22.TypeResult;
		String r = JSONArray.fromObject( renvaResult).toString();
		renvaResultStrformat=r;
		System.out.println(r);
		test.renva=(String) renvaResult.get(0).get("name");
		
		
		lic.renvaList=renvaResult;
		   test.event=lic.getEvent(keyword.split(" "));
			test.cinsyv=lic.getcinsyv(sincin);
			
			  eventResultStrformat = JSONArray.fromObject( lic.liEvents).toString();	
		
	//	test.renva="恋爱男女";
	  //  test.event="0010001_恋爱男女_追求";
	//	test.cinsyv="正面";
		String sx=test.search4tonitsi(keyword);
		cmdReturnStr=sx;
		System.out.println(sx);
		
		
	}

}
 